/*
 * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package com.sun.jmx.snmp.IPAcl;

import java.util.Vector;
import java.util.Enumeration;
import java.io.Serializable;
import java.net.UnknownHostException;

import java.security.Principal;
import java.security.acl.Group;

/**
 * This class is used to represent a subnet mask (a group of hosts
 * matching the same
 * IP mask).
 *
 */

class GroupImpl extends PrincipalImpl implements Group, Serializable {
    private static final long serialVersionUID = -7777387035032541168L;

    /**
     * Constructs an empty group.
     * @exception UnknownHostException Not implemented
     */
    public GroupImpl() throws UnknownHostException {
    }

    /**
     * Constructs a group using the specified subnet mask.
     *
     * @param mask The subnet mask to use to build the group.
     * @exception UnknownHostException if the subnet mask cann't be built.
     */
    public GroupImpl(String mask) throws UnknownHostException {
        super(mask);
    }

    /**
     * Adds the specified member to the group.
     *
     * @param p the principal to add to this group.
     * @return true if the member was successfully added, false if the
     *     principal was already a member.
     */
    public boolean addMember(Principal p) {
        // we don't need to add members because the ip address is a
        // subnet mask
        return true;
    }

    public int hashCode() {
        return super.hashCode();
    }

    /**
     * Compares this group to the specified object. Returns true if the object
     * passed in matches the group represented.
     *
     * @param p the object to compare with.
     * @return true if the object passed in matches the subnet mask,
     *   false otherwise.
     */
    public boolean equals(Object p) {
        if (p instanceof PrincipalImpl || p instanceof GroupImpl) {
            if ((super.hashCode() & p.hashCode()) == p.hashCode())
                return true;
            else
                return false;
        } else {
            return false;
        }
    }

    /**
     * Returns true if the passed principal is a member of the group.
     *
     * @param p the principal whose membership is to be checked.
     * @return true if the principal is a member of this group, false otherwise.
     */
    public boolean isMember(Principal p) {
        if ((p.hashCode() & super.hashCode()) == p.hashCode())
            return true;
        else
            return false;
    }

    /**
     * Returns an enumeration which contains the subnet mask.
     *
     * @return an enumeration which contains the subnet mask.
     */
    public Enumeration<? extends Principal> members() {
        Vector<Principal> v = new Vector<Principal>(1);
        v.addElement(this);
        return v.elements();
    }

    /**
     * Removes the specified member from the group. (Not implemented)
     *
     * @param p the principal to remove from this group.
     * @return allways return true.
     */
    public boolean removeMember(Principal p) {
        return true;
    }

    /**
     * Prints a string representation of this group.
     *
     * @return  a string representation of this group.
     */
    public String toString() {
        return ("GroupImpl :" + super.getAddress().toString());
    }
}
